#include <stdio.h>
#include "nvs_flash.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

/******************************************/
#include "led.h"
#include "oled.c"
#include "uart.h"
#include <esp_system.h>
/******************************************/


// #include "esp_rom_sys.h"
// #include "soc/rtc_cntl_reg.h"
// #include "soc/sens_reg.h"

// uint32_t get_apb_clock_freq(void) {
//     uint32_t apb_clk_freq = 0;
//     uint32_t rtc_clk_src = REG_GET_FIELD(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_RTC_SLOW_CLK_SEL);
//     if (rtc_clk_src == 0) {
//         // 主时钟源为 XTAL
//         apb_clk_freq = (uint32_t)esp_rom_get_xtal_auto();
//     } else if (rtc_clk_src == 1) {
//         // 主时钟源为 RC_FAST_CLK
//         uint32_t rc_fast_clk_cal = REG_GET_FIELD(SENS_SAR_MEAS_START2_REG, SENS_RC_FAST_CLK_CAL);
//         apb_clk_freq = (rc_fast_clk_cal * (120 * 1000)) / 1024;
//     }
//     return apb_clk_freq;
// }


/**
 * @brief       程序入口
 * @param       无
 * @retval      无
 */
void app_main(void)
{
    esp_err_t ret;
    uint8_t index = 0, flag = 0;

    uint8_t arrp[3] = {'1', '2', '\0'};

    uint8_t len = 0; 
    uint32_t cpumh = 0;
    uint16_t times = 0 ;
    unsigned char data[RX_BUF_SIZE] = {0};

    ret = nvs_flash_init(); /* 初始化NVS */

    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
    {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }

    led_init();         /* 初始化LED */
    usart_init(115200); /* 初始化串口 */

    OLED_Init();

    vTaskDelay(200); /* 延时500ms */
    OLED_Clear();
    // OLED_ShowChar(0,0,'2',16);

    // OLED_Init();
    // OLED_Clear();
    // OLED_Display_On(();

    OLED_ShowString(0, 0, (uint8_t *)"hello,world ", 16);

    while (1)
    {
        uart_get_buffered_data_len(USART_UX, (size_t *)&len); /* 获取环形缓冲区数据长度 */

        if (len > 0) /* 判断数据长度 */
        {
            memset(data, 0, RX_BUF_SIZE); /* 对缓冲区清零 */
            printf("\n您发送的消息为:\n");
            uart_read_bytes(USART_UX, data, len, 100);                                  /* 读数据 */
            uart_write_bytes(USART_UX, (const char *)data, strlen((const char *)data)); /* 写数据 */
        }
        else
        {
            times++;

            if (times % 5000 == 0)
            {
                printf("\n正点原子 ATK-DNESP32-S3 开发板 串口实验\n");
                printf("正点原子@ALIENTEK\n\n\n");
            }

            if (times % 200 == 0)
            {
                printf("ss\n");
            }

            if (times % 30 == 0)
            {
                LED_TOGGLE();

                OLED_ShowString(0, 2, arrp, 16);
                arrp[0]++;
                if (arrp[0] > '9')
                {
                    arrp[0] = '0';
                }
            }

            vTaskDelay(10);
        }
    }
}
